/**
  * @File    :   ap3216c.c
  * @Time    :   2020/04/05 15:42:05
  * @Author  :   huenrong
  */

#include "ap3216c.h"

/**
  * @name   ap3216c_init
  * @brief  ap3216c初始化
  * @param  fd: 设备文件描述符
  * @retval 成功: 返回0
            失败: 返回-1
  */
int ap3216c_init(const int fd)
{
    int ret = -1;
    uint8_t ap3216c_config = 0;

    // 初始化ap3216c
    // 复位ap3216c
    ap3216c_config = SW_RESET;
    ret = i2c_write_data_sub(fd, AP3216C_I2C_ADDR, AP3216C_SYSTEM_CONFIG, &ap3216c_config, 1);
    if (-1 == ret)
    {
        printf("ap3216c reset fail\n");

        return -1;
    }
    // 复位以后至少延时10ms
    usleep(20 * 1000);

    // 开启ALS、PS+IR
    ap3216c_config = ALS_PS_IR_FUNCTION_ACTIVE;
    ret = i2c_write_data_sub(fd, AP3216C_I2C_ADDR, AP3216C_SYSTEM_CONFIG, &ap3216c_config, 1);
    if (-1 == ret)
    {
        printf("ap3216c set mode fail\n");

        return -1;
    }
    // 配置后需要延时一段时间才生效
    usleep(350 * 1000);

    return 0;
}

/**
  * @name   ap3216c_read_als
  * @brief  ap3216c读取als数据
  * @param  read_als_data: 读取到的als数据
  * @retval 成功: 0
  *         失败: -1
  */
int ap3216c_read_data(uint16_t *read_ir_data, uint16_t *read_als_data,
                      uint16_t *read_ps_data, const int fd)
{
    int ret = -1;
    uint8_t read_data[6] = {0};

    // 循环读取所有传感器数据
    for (uint8_t i = 0; i < 6; i++)
    {
        ret = i2c_read_data_sub(&read_data[i], fd, AP3216C_I2C_ADDR, (AP3216C_IR_DATA_LOW + i), 1);
        if (-1 == ret)
        {
            printf("ao3216c read data fail\n");
        }
    }

    // IR_OF位为1,则数据无效
    if (read_data[0] & 0x80)
    {
        *read_ir_data = 0;
    }
    // 读取IR传感器的数据
    else
    {
        *read_ir_data = ((uint16_t)read_data[1] << 2) | (read_data[0] & 0x03);
    }

    // 读取ALS传感器的数据
    *read_als_data = ((uint16_t)read_data[3] << 8) | read_data[2];

    // PS_OF位为1,则数据无效
    if (read_data[4] & 0x40)
    {
        *read_ps_data = 0;
    }
    // 读取PS传感器的数据
    else
    {
        *read_ps_data = ((uint16_t)(read_data[5] & 0x3F) << 4) | (read_data[4] & 0x0F);
    }

    return 0;
}
